home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / flying-6.11 / vector.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-30  |  3.4 KB  |  186 lines

  1. #ifndef _global_h
  2. #    include "global.h"
  3. #endif
  4.  
  5. #include <stdarg.h>
  6.  
  7. #ifndef _vector_h
  8. #    include "vector.h"
  9. #endif
  10.  
  11. Vector VectorZero;
  12. Real Vector::ErrorZero = RealZero;
  13.  
  14.  
  15. Vector::Vector( int n, double d0, ... )
  16. {
  17. va_list    argptr;
  18.  
  19.     va_start(argptr,d0);
  20.     dim = n;
  21.     if (dim) {
  22.         data = new Real [dim];
  23.         if (n>0)    data[0] = d0;
  24.         for (int i=1;i<n;i++) {
  25.             data[i] = Real( va_arg(argptr,double) );
  26.         }
  27.     }
  28.     va_end(argptr);
  29. }
  30.  
  31. Vector::Vector( const Vector &v ) {
  32.     dim  = v.dim;
  33.     data = new Real[dim];
  34.     for (int i=0;i<dim;i++)        data[i] = v.data[i];
  35. }
  36.  
  37. void Vector::show(const char *str) const {
  38.     putchar('(');
  39.     for (int i=0;i<dim;i++) {
  40.         if (i)    putchar(',');
  41.         printf( "%g", (double)data[i] );
  42.     }
  43.     putchar(')');
  44.     if (str)        printf(str);
  45. }
  46.  
  47. int Vector::IsZero() const {
  48.     for (int i=0;i<dim;i++) {
  49.         if (data[i]!=RealZero)    return 0;
  50.     }
  51.     return -1;
  52. }
  53.  
  54. void Vector::Resize(int n) {
  55.     if (n>dim) {
  56.         Real    *new_data;
  57.  
  58.         new_data = new Real[n];                            // allocate new array
  59.         for (int i=0;i<dim;i++)        new_data[i] = data[i];    // copy old data
  60.         for (            ;i<n;i++)        new_data[i] = RealZero;    // reset new data
  61.         if (dim)        delete [] data;                                // free old array
  62.         data = new_data;
  63.         dim  = n;
  64.     }
  65. }
  66.  
  67. Real &Vector::GetRef(int n) {
  68. static Real    error=RealZero;
  69.  
  70.     if (n<0) {
  71.         fprintf(stderr,"illegal index: GetRef(%d)\n",n);
  72.         return error;                // return at least something to play with ...
  73.     }
  74.     if (n>=dim)    Resize(n+1);
  75.     return data[n];
  76. }
  77.  
  78. Real Vector::SqrNorm() const {
  79. Real    erg = RealZero;
  80.  
  81.     for (int i=0;i<dim;i++)        erg += data[i]*data[i];
  82.     return erg;
  83. }
  84.  
  85.  
  86. const Vector &Vector::operator=(const Vector &v) {
  87.     if (dim<v.dim) {
  88.         if (dim) delete [] data;
  89.         data = new Real[v.dim];
  90.     }
  91.     dim = v.dim;
  92.     if (!dim)    delete [] data;
  93.     else            for (int i=0;i<dim;i++)        data[i] = v.data[i];
  94.     return *this;
  95. }
  96.  
  97. const Vector &Vector::operator<<=(Vector &v) {
  98.     if (dim)        delete [] data;
  99.     dim  = v.dim;
  100.     data = v.data;
  101.     v.dim  = 0;
  102.     return *this;
  103. }
  104.  
  105. Real operator*(const Vector& z1, const Vector& z2)
  106. {
  107. int    min_dim = (z1.dim>z2.dim)?z1.dim:z2.dim;
  108. Real    erg = RealZero;
  109.  
  110.         for (int i=0;i<min_dim;i++)    erg += z1.data[i]*z2.data[i];
  111.         return erg;
  112. }
  113.  
  114. int operator==(const Vector& z1, const Vector& z2)
  115. {
  116.         if (z1.dim<z2.dim) {
  117.             for (int i=0;i<z1.dim;i++)
  118.                 if (z1.data[i]!=z2.data[i])    return 0;
  119.             for (       ;i<z2.dim;i++)
  120.                 if (z2.data[i]!=RealZero)        return 0;
  121.             return -1;
  122.         }
  123.         else {
  124.             for (int i=0;i<z2.dim;i++)
  125.                 if (z1.data[i]!=z2.data[i])    return 0;
  126.             for (       ;i<z1.dim;i++)
  127.                 if (z1.data[i]!=RealZero)        return 0;
  128.             return -1;
  129.         }
  130. }
  131.  
  132. const Vector& Vector::operator+=(const Vector& z2)
  133. {
  134.     if (z2.dim>dim)    Resize(z2.dim);
  135.     for (int i=0;i<dim;i++)            data[i]+=z2.data[i];
  136.     return *this;
  137. }
  138. const Vector& Vector::operator-=(const Vector& z2)
  139. {
  140.     if (z2.dim>dim)    Resize(z2.dim);
  141.     for (int i=0;i<dim;i++)            data[i]-=z2.data[i];
  142.     return *this;
  143. }
  144. const Vector& Vector::operator*=(const Real& r)
  145. {
  146.     for (int i=0;i<dim;i++)            data[i]*=r;
  147.     return *this;
  148. }
  149. const Vector& Vector::operator/=(const Real& r)
  150. {
  151.     for (int i=0;i<dim;i++)            data[i]/=r;
  152.     return *this;
  153. }
  154.  
  155.  
  156. #if (Vec2IsVector==0)
  157.  
  158. #ifndef _vec2_h
  159. #    include "vec2.h"
  160. #endif
  161.  
  162. Vector::Vector( const Vec2 &v ) {
  163.     dim = 2;
  164.     data = new Real [dim];
  165.     data[0] = v.X();
  166.     data[1] = v.Y();
  167. }
  168.  
  169. #endif
  170.  
  171. #if (Vec3IsVector==0)
  172.  
  173. #ifndef _vec3_h
  174. #    include "vec3.h"
  175. #endif
  176.  
  177. Vector::Vector( const Vec3 &v ) {
  178.     dim = 3;
  179.     data = new Real [dim];
  180.     data[0] = v.X();
  181.     data[1] = v.Y();
  182.     data[2] = v.Z();
  183. }
  184.  
  185. #endif
  186.